module.exports = (app) => {
  const express = require('express')
  const jwt = require('jsonwebtoken')
  const AdminUser = require('./../../models/AdminUser')
  const assert = require('http-assert')

  const router = express.Router({
    // 这个是合并父级路由的参数
    mergeParams: true
  })

  // 新建分类路由
  router.post('/', async (req, res) => {
    // 这里要想能够接收表单提交的数据，必须使用app.use(express.json())
    const model = await req.model.create(req.body)
    res.send(model)
  })

  // 编辑分类，点击提交
  router.put('/:id', async (req, res) => {
    // 这里要想能够接收表单提交的数据，必须使用app.use(express.json())
    const model = await req.model.findByIdAndUpdate(req.params.id, req.body)
    res.send(model)
  })
  // 删除分类，点击提交
  router.delete('/:id', async (req, res) => {
    // 这里要想能够接收表单提交的数据，必须使用app.use(express.json())
    await req.model.findByIdAndDelete(req.params.id, req.body)
    res.send({
      success: true
    })
  })

  // 分类列表路由
  router.get('/' ,async (req, res) => {
    const queryOptions = {}
    if (req.model.modelName == 'Category') {
      queryOptions.populate = 'parents'
    }

    // 集合查询（关联查询），因为这里parents是一个id，要想变成对象，就需要关联查询
    const items = await req.model.find().setOptions(queryOptions).limit(10)
    // const items = await req.model.find().populate('parents').limit(10)
    res.send(items)
  })

 // 登录校验中间件
 const authMiddleware = require('./../../middleware/auth')
const resourceMiddleware = require('./../../middleware/resource')

  // 根据id获取该分类信息
  router.get('/:id', async (req, res) => {
    const model = await req.model.findById(req.params.id)
    res.send(model)
  })

  // 使用中间件的方式
  app.use('/admin/api/rest/:resource', authMiddleware(),resourceMiddleware(),router)

  // 获取上传图标
  const multer = require('multer')
  const upload = multer({dest: __dirname + '/../../uploads'})
  app.post('/admin/api/upload',authMiddleware(), upload.single('file'), async (req, res) => {
    const file = req.file
    file.url = `http://localhost:3000/uploads/${file.filename}`
    res.send(file)
  })


  // 登录接口
  app.post('/admin/api/login', async (req, res) => {
    const { username, password } = req.body
    // 1. 根据用户名找用户
    // 因为在服务端存储的时候，设置了密码不可见，所以这里要想能获取到密码，需要采用这种方式
    const user = await AdminUser.findOne({username}).select('+password')
    assert(user, 422, '用户不存在')
    // if (!user) {
    //   return res.status(422).send({
    //     message: '用户不存在'
    //   })
    // }
    // 2. 校验密码
    const isValid = require('bcrypt').compareSync(password, user.password)
    assert(isValid, 422, '密码不匹配')
    // if (!isValid) {
    //   return res.status(422).send({
    //     message: '密码不匹配'
    //   })
    // }
    // 3. 返回token

    const token = jwt.sign({ id: user._id }, app.get('secret'))
    res.send({token})
  })


  // 错误处理
  app.use(async (err,req,res,next) => {
    res.status(err.statusCode).send({
      message: err.message
    })
  })
}